package org.dbp.core.mvc.crud.parser;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.PropertyUtils;
/**
 * 
 * @author dbp
 *
 * @param <C>		Entidad.
 * @param <F>		Formulario de la entidad.
 * @param <FL>		Formulario filtro. 
 * @param <FFLT>	Formulario filtro la linea del registro.
 * @param <EFL>		Entidad donde se define del filtro.
 */
public class GenericParser <C extends Serializable,F extends Serializable, FL extends Serializable
	,FFLT extends Serializable,EFL extends Serializable>{

	private Class<C> clasesC;
	private Class<F> clasesF;
	private Class<FL> clasesFL;
	private Class<EFL> claseEFL;
	
	
	public GenericParser(Class<C> clasesC, Class<F> clasesF, Class<FL> clasesFL,Class<EFL> claseEFL) {
		super();
		this.clasesC = clasesC;
		this.clasesF = clasesF;
		this.clasesFL = clasesFL;
		this.claseEFL=claseEFL;
	}
	
	public EFL parserFilter(FFLT form){
		EFL entity=null;
		try {
			entity=claseEFL.newInstance();
			PropertyUtils.copyProperties(entity, form);
		} catch (IllegalAccessException | InvocationTargetException
				| NoSuchMethodException | InstantiationException e) {
			e.printStackTrace();
		}
		return entity;
	}

	public F parserForm(F valdev,C prueba) {
		try {
			PropertyUtils.copyProperties(valdev, prueba);
		} catch (IllegalAccessException |InvocationTargetException |NoSuchMethodException e) {
			e.printStackTrace();
		}
		return valdev;
	}
	
	public C parerEntity(F form) {
		C valdev=null;
		try {
			valdev=clasesC.newInstance();
			PropertyUtils.copyProperties(valdev, form);
		} catch (IllegalAccessException|InvocationTargetException|NoSuchMethodException|InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		return valdev;
	}
	
	public List<FL> parserListado(List<C> listado){
		List<FL> valdev= new ArrayList<FL>();
		try {
			FL elemento=null;
			for(C prueba:listado){
				elemento=clasesFL.newInstance();
				PropertyUtils.copyProperties(elemento, prueba);
				valdev.add(elemento);
			}
		} catch (IllegalAccessException|InvocationTargetException|NoSuchMethodException | InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return valdev;
	}
}
